# -*- coding: UTF-8 -*-
# .@FileName:ipuxin_plug_ui
# .@Data....:2025-02-11 : 22 : 18
# .@Aurhor..:LiuJingYu
"""
launch:
from __future__ import unicode_literals, print_function
import maya.cmds as mc
"""

# from os.path import join, isdir
# import os
# import sys
# import maya
# import maya.cmds as cmds
#
#
# main_menu_name = 'ipuxin_plug'
# main_menu_value = 'IpuxinMenu'
# pre_plug_name = 'i_'
#
#
# module_path = cmds.getModulePath(moduleName = main_menu_name)
#
# script_path = join(module_path, 'Scripts')
#
# packages_path = join(module_path, 'packages')
#
#
# def get_py_file(target_path):
#     dirs = os.listdir(target_path)
#     # 指定文件夹下的文件名
#     menu_filename = []
#     for temp_dir in dirs:
#         # 拼接绝对路径，判断是否为目录
#         absolute_dir_temp = join(target_path, temp_dir)
#         # 只把文件作为一级目录显示
#         if not isdir(absolute_dir_temp):
#             # ipuxin_menu_ui.py
#             file_extension = temp_dir.split('.')[-1].lower()
#             if file_extension == 'py':
#                 menu_filename.append(temp_dir.split('.')[0])
#
#     return menu_filename
#
#
#
# def get_under_dir(target_path):
#     dirs = os.listdir(target_path)
#     # 指定目录下的目录名
#     base_dir = []
#     # 指定目录下的目录绝对路径
#     absolute_dir = []
#     for temp_dir in dirs:
#         # 拼接绝对路径，判断是否为目录
#         absolute_dir_temp = join(target_path, temp_dir)
#         # 只把目录作为一级目录显示
#         if isdir(absolute_dir_temp):
#             base_dir.append(temp_dir)
#             absolute_dir.append(absolute_dir_temp)
#     return base_dir, absolute_dir
#
#
# # 一级菜单，一级菜单的绝对路径
# _, first_menu_path = get_under_dir(script_path)
#
# # 插件所在目录
# _, packages_paths = get_under_dir(packages_path)
# packages_second_paths = []
# for p_p in packages_paths:
#     _, p_p_temp = get_under_dir(p_p)
#     packages_second_paths += p_p_temp
# print("packages_second_paths: {}".format(packages_second_paths))
#
# menu_item_list = []
# for f_m_p in first_menu_path:
#     temp_fmp = get_py_file(f_m_p)
#     # 获取当前目录名
#     cur_dir_name = os.path.basename(f_m_p)
#     menu_item_list.append([cur_dir_name, temp_fmp])
#
#
# python_paths = []
# python_paths += first_menu_path
# python_paths += packages_paths
#
#
# # sys.path 是Python的模块搜索路径列表
# # 把“自定义目录”加入Maya目录
# for python_path in python_paths:
#     if python_path not in sys.path:
#         sys.path.append(python_path)
#
#
# def create_menu(*args):
#     # 获取mel全局变量的值
#     gMainWindow = maya.mel.eval('$tmpVar=$gMainWindow')
#     # 创建主窗口
#     # Result：MayaWindow|menu63
#     main_menu = cmds.menu(main_menu_value, label = main_menu_name, tearOff = True, parent = gMainWindow)
#     print('main_menu: {}'.format(main_menu))
#
#     # 含有子层级的
#     for menu_name in menu_item_list:
#         # 显示一级菜单
#         far_menu_name = menu_name[0]
#         cmds.menuItem(pre_plug_name + far_menu_name, label = far_menu_name, subMenu = True, tearOff = True,
#                       parent = main_menu_value)
#         # 循环显示二级菜单
#         for sub_menu_name in menu_name[1]:
#             cmds.menuItem(pre_plug_name + sub_menu_name, label = sub_menu_name,
#                           parent = pre_plug_name + far_menu_name, c = 'import {0};reload({0});'.format(sub_menu_name))
#
#
# def delete_menu(*args):
#     """
#     专门执行删除，用于去勾插件时
#     :param args:
#     :return:
#     """
#     if cmds.menu(main_menu_value, ex = True):
#         cmds.deleteUI(main_menu_value)


from __future__ import unicode_literals, print_function

import os
import sys
import maya
import maya.cmds as cmds
# 在 Python 3.7 中，使用 importlib.reload 进行模块重新加载
import importlib

# 配置常量
# 主菜单的显示名称
MAIN_MENU_NAME = 'ipuxin_plug'
# 主菜单的唯一标识符
MAIN_MENU_ID = 'IpuxinMenu'
# 菜单项名称的前缀
PREFIX = 'i_'
# 脚本所在的目录名
SCRIPT_DIR = 'Scripts'
# 包所在的目录名
PACKAGES_DIR = 'packages'


def get_py_modules(target_dir):
    """
    获取指定目录中所有 Python 模块名（不带扩展名）。

    :param target_dir: 目标目录的路径
    :return: 包含所有 Python 模块名的列表
    """
    # 检查目标目录是否存在
    if not os.path.isdir(target_dir):
        return []

    modules = []
    # 遍历目标目录下的所有文件
    for filename in os.listdir(target_dir):
        # 检查文件是否为 Python 文件
        if filename.lower().endswith('.py') and os.path.isfile(os.path.join(target_dir, filename)):
            # 去除文件扩展名，添加到模块列表中
            modules.append(os.path.splitext(filename)[0])
    return modules


def get_subdirectories(target_dir):
    """
    获取指定目录下所有有效子目录的路径。

    :param target_dir: 目标目录的路径
    :return: 包含所有子目录路径的列表
    """
    # 检查目标目录是否存在
    if not os.path.isdir(target_dir):
        return []

    return [
        os.path.join(target_dir, name)
        for name in os.listdir(target_dir)
        if os.path.isdir(os.path.join(target_dir, name))
    ]


def setup_sys_paths():
    """
    配置 Python 系统路径，将指定目录及其子目录添加到 sys.path 中。

    :return: 一级脚本目录的列表
    """
    # 获取指定模块的路径
    module_path = cmds.getModulePath(moduleName=MAIN_MENU_NAME)
    if not module_path:
        # 如果未找到模块路径，抛出运行时错误
        raise RuntimeError(f"模块 {MAIN_MENU_NAME} 路径未找到")

    # 构建脚本目录的路径
    script_path = os.path.join(module_path, SCRIPT_DIR)
    # 获取脚本目录下的一级子目录
    first_level_dirs = get_subdirectories(script_path)

    # 构建包目录的路径
    packages_path = os.path.join(module_path, PACKAGES_DIR)
    # 获取包目录下的一级子目录
    package_dirs = get_subdirectories(packages_path)
    second_level_dirs = []
    # 遍历包目录下的一级子目录，获取其二级子目录
    for pkg_dir in package_dirs:
        second_level_dirs.extend(get_subdirectories(pkg_dir))

    # 合并所有需要添加的路径，并去重
    all_paths = set(first_level_dirs + package_dirs + second_level_dirs)

    # 将所有路径添加到 sys.path 中
    for path in all_paths:
        if path not in sys.path:
            sys.path.append(path)

    return first_level_dirs


def build_menu_structure(script_dirs):
    """
    构建菜单结构数据，将每个脚本目录及其包含的 Python 模块组合成元组列表。

    :param script_dirs: 脚本目录的列表
    :return: 包含菜单结构数据的列表，每个元素为 (目录名, [模块名列表])
    """
    menu_structure = []
    for dir_path in script_dirs:
        # 获取目录名
        dir_name = os.path.basename(dir_path)
        # 获取目录下的 Python 模块名
        modules = get_py_modules(dir_path)
        if modules:
            # 如果目录下有 Python 模块，添加到菜单结构数据中
            menu_structure.append((dir_name, modules))
    return menu_structure


def create_menu():
    """
    创建主界面菜单，包括主菜单和子菜单，并为每个子菜单添加模块项。
    """
    # 删除现有的菜单，防止重复创建
    delete_menu()

    # 获取 Maya 主窗口
    main_window = maya.mel.eval('$temp = $gMainWindow')

    # 创建主菜单
    main_menu = cmds.menu(
        MAIN_MENU_ID,
        label=MAIN_MENU_NAME,
        tearOff=True,
        parent=main_window
    )

    # 配置 Python 系统路径，并获取一级脚本目录
    script_dirs = setup_sys_paths()
    # 构建菜单结构数据
    menu_data = build_menu_structure(script_dirs)

    for category, modules in menu_data:
        # 创建子菜单
        submenu = cmds.menuItem(
            f"{PREFIX}{category}",
            label=category,
            subMenu=True,
            tearOff=True,
            parent=MAIN_MENU_ID
        )

        # 为子菜单添加模块项
        for mod in modules:
            # 生成模块加载和重新加载的命令，在命令中完整导入 importlib
            cmd = f"import importlib; import {mod}; importlib.reload({mod})"

            cmds.menuItem(
                f"{PREFIX}{mod}",
                label=mod.replace('_', ' ').title(),
                parent=submenu,
                command=cmd
            )


def delete_menu():
    """
    删除现有的主菜单。
    """
    # 检查主菜单是否存在
    if cmds.menu(MAIN_MENU_ID, exists=True):
        # 如果存在，删除主菜单
        cmds.deleteUI(MAIN_MENU_ID)






